package com.xuecheng.content.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.content.mapper.CourseBaseMapper;
import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.mapper.CourseMarketMapper;
import com.xuecheng.content.model.dto.AddCourseDto;
import com.xuecheng.content.model.dto.CourseBaseInfoDto;
import com.xuecheng.content.model.dto.EditCourseDto;
import com.xuecheng.content.model.dto.QueryCourseParamsDto;
import com.xuecheng.content.model.po.CourseBase;
import com.xuecheng.content.model.po.CourseCategory;
import com.xuecheng.content.model.po.CourseMarket;
import com.xuecheng.content.service.CourseBaseInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Slf4j
public class CourseBaseInfoServiceImpl implements CourseBaseInfoService {

    @Autowired
//    课程基本信息mapper
    private CourseBaseMapper courseBaseMapper;

    @Autowired
    //课程营销信息mapper
    private CourseMarketMapper courseMarketMapper;


    @Autowired
//    课程分类信息的mapper
    private CourseCategoryMapper courseCategoryMapper;


    @Autowired
    private CourseBaseInfoService courseBaseInfoService;


    /**
     * 分页查询课程信息
     *
     * @param pageParams           分页参数
     * @param queryCourseParamsDto 分页条件
     * @return 查询结果
     */
    @Override
    public PageResult<CourseBase> queryCourseBaseList(PageParams pageParams, QueryCourseParamsDto queryCourseParamsDto) {
//        传入分页参数，构建分页参数对象
        IPage<CourseBase> page = new Page(pageParams.getPageNo(), pageParams.getPageSize());
//        构建查询条件
        LambdaQueryWrapper<CourseBase> queryWrapper = new LambdaQueryWrapper();
//        判断课程名字是否为空，不为空就拼接上这个条件，根据课程名称查询
        queryWrapper.like(StringUtils.isNotEmpty(queryCourseParamsDto.getCourseName()), CourseBase::getName, queryCourseParamsDto.getCourseName());
//        判断状态是否为空，不为空就拼接上这个条件
        queryWrapper.eq(StringUtils.isNotEmpty(queryCourseParamsDto.getAuditStatus()), CourseBase::getAuditStatus, queryCourseParamsDto.getAuditStatus());
//        判断课程发布状态是否为空，不为空就添加上课程发布状态条件进行拼接查询数据库
//        queryWrapper.eq(StringUtils.isNotEmpty(queryCourseParamsDto.getPublishStatus()),CourseBase::getStatus,queryCourseParamsDto.getPublishStatus());
//        得到分页查询出来的结果对象
        IPage<CourseBase> selectPage = courseBaseMapper.selectPage(page, queryWrapper);
//        获取数据列表
        List<CourseBase> records = selectPage.getRecords();
//        获取总条数
        long total = selectPage.getTotal();

        PageResult<CourseBase> pageResult = new PageResult<>(records, total, pageParams.getPageNo(), pageParams.getPageSize());

        return pageResult;
    }

    /**
     * 新增课程信息
     * @param companyId     机构id
     * @param dto
     * @return
     */
    @Override
    @Transactional  //多表增删改都要加上事务注解
    public CourseBaseInfoDto createCourseBase(Long companyId, AddCourseDto dto) {

//        参数的合法性校验
        if (StringUtils.isBlank(dto.getName())) {
//            throw new RuntimeException("课程名称为空");
            XueChengPlusException.cast("课程名称为空");
        }

        if (StringUtils.isBlank(dto.getMt())) {
//            throw new RuntimeException("课程分类为空");
            XueChengPlusException.cast("课程分类为空");
        }

        if (StringUtils.isBlank(dto.getSt())) {
            throw new XueChengPlusException("课程分类为空");
        }

        if (StringUtils.isBlank(dto.getGrade())) {
            throw new XueChengPlusException("课程等级为空");
        }

        if (StringUtils.isBlank(dto.getTeachmode())) {
            throw new XueChengPlusException("教育模式为空");
        }

        if (StringUtils.isBlank(dto.getUsers())) {
            throw new XueChengPlusException("适应人群");
        }

        if (StringUtils.isBlank(dto.getCharge())) {
            throw new XueChengPlusException("收费规则为空");
        }


//        创建课程基本信息表对象
        CourseBase courseBaseNew = new CourseBase();
//        通过对象属性拷贝，将值set进去
        BeanUtils.copyProperties(dto, courseBaseNew);
        courseBaseNew.setCompanyId(companyId);
//        todo？未完成，待后期开发
//        courseBaseNew.setCompanyName("中科全安");
        courseBaseNew.setCreateDate(LocalDateTime.now());
//        后期做
//        courseBaseNew.setChangePeople();
//        发布状态默认为未发布
        courseBaseNew.setStatus("203001");
//        审核状态默认为未提交
        courseBaseNew.setAuditStatus("202002");
//        向课程基本信息表 course_base写入数据
        int insert = courseBaseMapper.insert(courseBaseNew);
        if (insert <= 0) {
            throw new RuntimeException("添加课程失败！");
        } else {
            log.info("新增课程基本信息插入完成，插入" + insert + "条");
        }
        //向课程营销表中写入数据
        CourseMarket courseMarketNew = new CourseMarket();
//        当插入完成以后，就会生成一个主键id，所以在这个时候，id已经生成了，可以被获取到
//        将信息拷贝到courseMarketNew
        BeanUtils.copyProperties(dto, courseMarketNew);
        Long courseId = courseBaseNew.getId();//课程id
        courseMarketNew.setId(courseId);
//        调用保存课程营销表信息的方法
        int result = saveCourseMarket(courseMarketNew);
//        保存信息以后，要从数据库查出完整详细信息
        CourseBaseInfoDto courseBaseInfo = getCourseBaseInfo(courseId);
        return courseBaseInfo;
    }


    /**
     * 根据课程id查询课程的详细数据
     * @param courseId 课程id
     * @return
     */
    //查询课程信息的详细数据
    public CourseBaseInfoDto getCourseBaseInfo(Long courseId){
//        1.从课程信息表查询而课程信息，
        CourseBase courseBase = courseBaseMapper.selectById(courseId);
        if (courseBase==null){
            return null;
        }
        CourseBaseInfoDto courseBaseInfoDto = new CourseBaseInfoDto();
        BeanUtils.copyProperties(courseBase,courseBaseInfoDto);
//        2.从课程营销表查询课程信息
        CourseMarket courseMarket = courseMarketMapper.selectById(courseId);
        if(courseMarket != null){
            BeanUtils.copyProperties(courseMarket,courseBaseInfoDto);
        }


//        3.从课程分类表中查询分类信息,将大分类和小分类的   【名称】set进去     （返回数据要求）
        CourseCategory courseCategoryBySt = courseCategoryMapper.selectById(courseBase.getSt());
        CourseCategory courseCategoryByMt = courseCategoryMapper.selectById(courseBase.getMt());
        //        3.组装到一起


//        BeanUtils.copyProperties(courseMarket,courseBaseInfoDto);
        courseBaseInfoDto.setStName(courseCategoryBySt.getName());
        courseBaseInfoDto.setMtName(courseCategoryByMt.getName());
        return courseBaseInfoDto;
    }

    /**
     * 根据id修改课程信息
     * @param companyId  课程id
     * @param dto       修改课程的数据模型
     * @return      返回的课程的详细信息数据模型CourseBaseInfoDto
     */
    @Override
    @Transactional
    public CourseBaseInfoDto updateCourseBase(Long companyId, EditCourseDto dto) {

//      拿到课程id
        Long courseId = dto.getId();
//        根据课程id查询课程信息
        CourseBase courseBase = courseBaseMapper.selectById(courseId);
        if (courseBase== null){
            XueChengPlusException.cast("课程不存在！");
        }
//        数据合法性校验
//        根据具体的的业务逻辑去校验
//        本机构只能修改本机构的课程
       /* if(!companyId.equals(courseBase.getCompanyId())){
            XueChengPlusException.cast("本机构只能修改本机构的课程！");
        }*/

//        1.（封装）修改课程表信息
            BeanUtils.copyProperties(dto,courseBase);
//        修改时间
        courseBase.setChangeDate(LocalDateTime.now());
        log.info("修改课程-》封装课程信息，课程信息封装完成：{}",courseBase);
//        更行数据库
        int result = courseBaseMapper.updateById(courseBase);
        if (result<=0){
            XueChengPlusException.cast("修改失败");
        }else {
            log.info("课程信息修改成功！");
        }
//    返回课程详细信息

//        CourseBaseInfoDto courseBaseInfo = courseBaseInfoService.getCourseBaseInfo(courseBase.getId());
        CourseBaseInfoDto courseBaseInfo = getCourseBaseInfo(courseId);
        log.info("修改完成--》返回修改后课程详细信息:{}",courseBaseInfo);
        return courseBaseInfo;
    }

    //    单独写一个插入课程营销表信息的方法     逻辑：存在则修改，不存在则新添加
    public int saveCourseMarket(CourseMarket courseMarketNew) {

//        参数校验
        String charge = courseMarketNew.getCharge();
        if (StringUtils.isEmpty(charge)) {
            throw new RuntimeException("收费规则为空");
        }
//            如果课程收费，价格没有填写也要抛出异常
        if (charge.equals("201001")) {
            if (courseMarketNew.getPrice() == null||courseMarketNew.getPrice().floatValue()<=0) {
//                throw  new RuntimeException("课程价格不能为空且价格不能小于0！");
                throw new XueChengPlusException("课程的价格不能为空并且必须大于0");
            }
        }
//          存在则修改，不存在则新添加
        Long id = courseMarketNew.getId();//课程营销表id
        CourseMarket courseMarket = courseMarketMapper.selectById(id);
        if (courseMarket==null) {
//            执行插入新数据
            int insert = courseMarketMapper.insert(courseMarketNew);
            return insert;
        }else{
//            执行修改
//            将courseMarketNew拷贝到courseMarket
            BeanUtils.copyProperties(courseMarketNew,courseMarket);
            courseMarket.setId(id);
            int insert = courseMarketMapper.updateById(courseMarket);
            return insert;
        }
    }


}
